﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Xml.Linq;
using System.Globalization;
using System.Text.RegularExpressions;
using System.Speech.Recognition;

namespace MBO_PIM
{
    /// <summary>
    /// Interaktionslogik für TerminBearbeiten.xaml
    /// </summary>
    /// 

    public partial class TerminBearbeiten : Window
    {
        private MainWindow mainWindow;
        private XElement elem;

        public TerminBearbeiten(XElement xelement, MainWindow window)
        {
            InitializeComponent();

            mainWindow = window;
            elem = xelement;

            stunden.MaxLength = 2;
            minuten.MaxLength = 2;

            // Daten in die Felder eintragen
            titel.Text = (String)xelement.Element("Titel").Value;
            String datum = (String)xelement.Element("DatumString").Value;
            datePicker.SelectedDate = DateTime.Parse(datum);
            String uhrzeit = (String)xelement.Element("Uhrzeit").Value;
            string[] split2 = uhrzeit.Split(':');
            stunden.Text = split2[0];
            minuten.Text = split2[1];
            if ((String)xelement.Element("Kategorie").Value == "Privat") kategorie.SelectedIndex = 0;
            if ((String)xelement.Element("Kategorie").Value == "Oeffentlich") kategorie.SelectedIndex = 1;
            ort.Text = (String)xelement.Element("Ort").Value;
            beschreibung.Text = (String)xelement.Element("Beschreibung").Value;

            // Spracheingabe
            SpeechRecognitionEngine recognizer = mainWindow.recognizer;

            recognizer.SpeechRecognized += (s, e1) =>
            {

                string text = e1.Result.Text;
                Console.WriteLine("Spracheingabe: " + text);

                if (text.Equals("speichern"))
                {
                    if (this.IsActive) speichern1();
                }
                if (text.Equals("abbrechen"))
                {
                    if (this.IsActive) abbrechen1();
                }
            };
        }

        private void speichern_Click(object sender, RoutedEventArgs e)
        {
            speichern1();
        }

        private void abbrechen_Click(object sender, RoutedEventArgs e)
        {
            abbrechen1();
        }

        public void speichern1()
        {
            // Daten auslesen (Datum und Uhrzeit)
            DateTime datum1 = DateTime.Parse(datePicker.SelectedDate.ToString());
            int stunden1 = int.Parse(stunden.Text);
            int minuten1 = int.Parse(minuten.Text);
            String uhrzeit1 = stunden.Text + ":" + minuten.Text;
            String kategorie1 = "";
            if (kategorie.SelectedIndex == 0) kategorie1 = "Privat";
            if (kategorie.SelectedIndex == 1) kategorie1 = "Oeffentlich";

            Console.Write(titel.Text);
            Console.Write(ort.Text);
            Console.Write(beschreibung.Text);

            if (String.IsNullOrEmpty(titel.Text)) MessageBox.Show("Bitte den Titel angeben.", "Fehler", MessageBoxButton.OK, MessageBoxImage.Exclamation);
            else if (String.IsNullOrEmpty(stunden.Text) || String.IsNullOrEmpty(minuten.Text)) MessageBox.Show("Bitte die Zeit angeben.", "Fehler", MessageBoxButton.OK, MessageBoxImage.Exclamation);
            else if (!IsValidTime(uhrzeit1)) MessageBox.Show("Uhrzeit ungültig!",
                "Fehler",
                MessageBoxButton.OK,
                MessageBoxImage.Exclamation);
            else
            {
                // MessageBox für die Abfrage, ob der Termin wirklich gelöscht werden soll
                string messageBoxText = "Wollen Sie die Änderungen wirklich speichern?";
                string caption = "Benachrichtigung";
                MessageBoxButton button = MessageBoxButton.YesNo;
                MessageBoxImage icon = MessageBoxImage.Warning;
                MessageBoxResult result = MessageBox.Show(messageBoxText, caption, button, icon);
                // ja, nein, abbrechen Befehlszuweisung
                switch (result)
                {
                    case MessageBoxResult.Yes:

                        // Laden der XML-Datei
                        XElement termine = XDocument.Load("..\\..\\datenbank.xml").Root;

                        // altes Element löschen
                        foreach (var a in termine.Elements())
                        {
                            String zwei = (String)elem.Element("Datum").Value;
                            String eins = (String)a.Element("Datum").Value;
                            String drei = (String)elem.Element("Uhrzeit").Value;
                            String vier = (String)a.Element("Uhrzeit").Value;

                            if (eins.CompareTo(zwei) == 0 && drei.CompareTo(vier) == 0)
                            {
                                a.Remove();
                            }
                        }

                        // neues (bearbeitetes) XML-Element anlegen
                        XElement element = new XElement("Termin",
                                            new XElement("Titel", titel.Text),
                                            new XElement("Datum", datum1.ToShortDateString()),
                                            new XElement("DatumString", datum1.ToString()),
                                            new XElement("Uhrzeit", uhrzeit1),
                                            new XElement("Kategorie", kategorie1),
                                            new XElement("Ort", ort.Text),
                                            new XElement("Beschreibung", beschreibung.Text));

                        // XML-Element in XML-Datei schreiben
                        termine.Add(element);

                        // XML-Datei abspeichern
                        termine.Save("..\\..\\datenbank.xml");

                        MessageBox.Show("Termin wurde geändert.");

                        // Fenster schließen und in die Terminübersicht wechseln
                        this.Close();
                        mainWindow.TermineAnzeigen();
                        break;
                    case MessageBoxResult.No:
                        break;

                }




            }
        }

        public void abbrechen1()
        {
            // Fenster schließen und in die Terminübersicht wechseln
            this.Close();
            mainWindow.TermineAnzeigen();
        }

        public bool IsValidTime(string thetime)
        {
            Regex checktime =
                new Regex("^(?:[01]?[0-9]|2[0-3]):[0-5][0-9]$");

            return checktime.IsMatch(thetime);
        }
    }
}
